package com.sisgesbyte.web.managedBean.mantenimiento.modulos;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.services.commonBean.GenericResponse;
import com.sisgesbyte.services.sistema.MantenimientoModulo;
import com.sisgesbyte.services.sistema.bean.ModuloBean;
import com.sisgesbyte.services.sistema.bean.ModuloMantenimientoBean;
import com.sisgesbyte.services.sistema.bean.ModuloMantenimientoResponse;
import com.sisgesbyte.web.managedBean.common.MantenimientoAbstract;
import com.sisgesbyte.web.managedBean.seguridad.OpcionesControlador;

@ManagedBean
@ViewScoped
public class ModulosMBean extends MantenimientoAbstract implements Serializable{

	private static final long serialVersionUID = 1L;
	
	@EJB
	private MantenimientoModulo mantenimientoModulo;
	private List<ModuloMantenimientoBean> listaModulo;
	private List<ModuloMantenimientoBean> selectedModulos;
	private String tipoMantenimiento;
	private String saved;
	private FiltrosSQLBean cadenaFiltros;
	@ManagedProperty(value="#{opcionesControlador}")
	private OpcionesControlador opcionesControlador;
	@Inject
	private Validaciones validaciones;
	private String txtBuscar;
	
	
	@PostConstruct
	private void init(){
		tipoMantenimiento = "";
		saved="";
		crearFiltro();
		inicializar();
	}

	public void inicializar(){
		try{
			ModuloMantenimientoResponse modulosService = mantenimientoModulo.mostrarModulos(ObtenerIdTransaccion(),cadenaFiltros);
			if(Integer.valueOf(modulosService.getCodigoRespuesta()) >-1){
				System.out.println("Tamaño " + modulosService.getListaModulosMantenimiento().size());
				listaModulo = modulosService.getListaModulosMantenimiento();
			}else{
				System.out.println(modulosService.getCodigoRespuesta() + "-" + modulosService.getMensajeRespuesta());
			}
		}catch(Exception e){
			System.out.println("Error en el MB ModulosMbean");
		}
	}
	public List<ModuloMantenimientoBean> getListaModulo() {
		return listaModulo;
	}

	public void setListaModulo(List<ModuloMantenimientoBean> listaModulo) {
		this.listaModulo = listaModulo;
	}
	public List<ModuloMantenimientoBean> getSelectedModulos() {

		return selectedModulos;
	}

	public void setSelectedModulos(List<ModuloMantenimientoBean> selectedModulos) {
		this.selectedModulos = selectedModulos;
	}
	
	public OpcionesControlador getOpcionesControlador() {
		return opcionesControlador;
	}

	public void setOpcionesControlador(OpcionesControlador opcionesControlador) {
		this.opcionesControlador = opcionesControlador;
	}
		
	public String getTipoMantenimiento() {
		return tipoMantenimiento;
	}

	public void setTipoMantenimiento(String tipoMantenimiento) {
		this.tipoMantenimiento = tipoMantenimiento;
	}

	public FiltrosSQLBean getCadenaFiltros() {
		return cadenaFiltros;
	}

	public void setCadenaFiltros(FiltrosSQLBean cadenaFiltros) {
		this.cadenaFiltros = cadenaFiltros;
	}

	public String getTxtBuscar() {
		return txtBuscar;
	}

	public void setTxtBuscar(String txtBuscar) {
		this.txtBuscar = txtBuscar;
	}

	public String getSaved() {
		return saved;
	}

	public void setSaved(String saved) {
		this.saved = saved;
	}

	//Metodo para capturar evento de checkbox
	public void unSelect(UnselectEvent event) {
		opcionesControlador.habilitarControles(selectedModulos.size());
    }
	
	public void checkSelect(SelectEvent event){
		opcionesControlador.habilitarControles(selectedModulos.size());
	}
	
	public void seleccionarItem(SelectEvent event){
		opcionesControlador.habilitarControles(selectedModulos.size());
	}
	
	public void dobleSelect(SelectEvent event){
		List<ModuloMantenimientoBean> selected = new ArrayList<ModuloMantenimientoBean>();
		selected.add((ModuloMantenimientoBean) event.getObject());
		setSelectedModulos(selected);
		setSaved("");
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	public String ObtenerIdTransaccion(){
		FacesContext fCtx = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
		String sessionId = session.getId().replace(".undefined", "");
		return sessionId;
	}
	
	public void actualizarLista(){
		setListaModulo(mantenimientoModulo.mostrarModulos(ObtenerIdTransaccion(),cadenaFiltros).getListaModulosMantenimiento());
	}
	
	@Override
	public void nuevoItem(){
		setSaved("");
		limpiarFormulario();
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_NUEVO);
	}
	@Override
	public void editItem(){
		setSaved("");
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}
	public void updateInsertItem(){
		if(tipoMantenimiento.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_NUEVO)){
			guardarItem();
		}
		if(tipoMantenimiento.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE)){
			modificarItem();
		}
	}
	public void guardarItem(){
		GenericResponse response = null;
		try{
			for(ModuloBean bean :listaSeleccionados(selectedModulos)){		
				response =mantenimientoModulo.nuevoModulo(ObtenerIdTransaccion(), bean);
				if(response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
					setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
					System.out.println("Se registro Correctamente");
				}else{
					setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
					System.out.println("Hubo un error al Registrar " + response.getCodigoRespuesta() + " - "+ response.getMensajeRespuesta());
				}
			}
			limpiarFormulario();
			actualizarLista();
		}catch(Exception e){
			setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
			System.out.println("Error en el proceso " + e);
		}
	}
	public void modificarItem(){
		GenericResponse response = null;
		try{
			for(ModuloBean bean :listaSeleccionados(selectedModulos)){			
				response = mantenimientoModulo.editModulo(ObtenerIdTransaccion(), bean);
				if(response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
					setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
					System.out.println("Se Acualizo correctamente");
				}else{
					setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
					System.out.println("Hubo un Error al Actualizar de BD " + response.getCodigoRespuesta() +" - " +response.getMensajeRespuesta() );
				}
			}
			actualizarLista();
		}catch(Exception e){
			setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
			System.out.println("Hubo un error al tratar de Actualizar " + e);
		}
	}
	
	public void eliminarItem(){
		GenericResponse response = null;
		try{
			for(ModuloMantenimientoBean bean :selectedModulos){					
				response = mantenimientoModulo.deleteModulo(ObtenerIdTransaccion(), bean.getCodModulo());
				if(response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
					System.out.println("Se elimino Correctamente");
				}else{
					System.out.println("No se pudo Eliminar de BD " + response.getCodigoRespuesta() +" - " + response.getMensajeRespuesta());
				}
			}
			actualizarLista();
			opcionesControlador.desactivarControles();
		}catch(Exception e){
			System.out.println("Hubo un error al tratar de Eliminar " +e);
		}
	}
		
	public void actualizarEstado(){
		GenericResponse response = null;
		try{
			for(ModuloBean bean :listaSeleccionados(listaModulo)){
				response = mantenimientoModulo.editModulo(ObtenerIdTransaccion(), bean);
				if(response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)){
					System.out.println("Se Acualizo correctamente");
				}
			}
			actualizarLista();
		}catch(Exception e){
			System.out.println("Hubo un error al actualizar el estado");
		}
	}
	
	public List<ModuloBean> listaSeleccionados(List<ModuloMantenimientoBean> listaRequest){
		List<ModuloBean> response = new ArrayList<ModuloBean>();
		for(ModuloMantenimientoBean bean :listaRequest){			
			ModuloBean req = new ModuloBean();
			req.setActivo(bean.getActive());
			req.setCodigo(validaciones.validarCampoInteger(bean.getCodModulo()));
			req.setDescripcion(validaciones.validarCamposString(bean.getDescripcion()));
			req.setImagen(validaciones.validarCamposString(bean.getIcon()));
			req.setNombre(validaciones.validarCamposString(bean.getNombreModulo()));
			req.setOrden(validaciones.validarCampoInteger(bean.getOrden()));
			req.setSummary(validaciones.validarCamposString(bean.getSummary()));
			req.setTipo(validaciones.validarCampoInteger(bean.getTipo()));
			req.setUrl(validaciones.validarCamposString(bean.getUrl()));
			req.setVersion(validaciones.validarCamposString(bean.getVersion()));
			response.add(req);
		}
		return response;
	}
	public void limpiarFormulario(){
		List<ModuloMantenimientoBean> nuevo = new ArrayList<ModuloMantenimientoBean>();
		ModuloMantenimientoBean bean = new ModuloMantenimientoBean();
		bean.setDescripcion("");
		nuevo.add(bean);
		this.selectedModulos = nuevo; 
	}
	public void crearFiltro(){
		FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
		try{
			if(getTxtBuscar() !=null && getTxtBuscar().toString().length() > 0){
				System.out.println("Ingresa");
				List<Object> valores = new ArrayList<>();
				List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
				FiltrosBean listaCampo = new FiltrosBean();
				List<String> campo = new ArrayList<String>();
				campo.add("m.id");
				campo.add("m.nombre");
				campo.add("tp.nombre");
				listaCampo.setCampos(campo);
				listaCampo.setOperador("like");
				filtro.add(listaCampo);
				filtroSQL.setListaFiltros(filtro);
				valores.add("%"+getTxtBuscar() + "%");
				filtroSQL.setListaValores(valores);
				
			}else{
				filtroSQL.setCampoOrden("m.id");
				filtroSQL.setTipoOrden("desc");
			}
			setCadenaFiltros(filtroSQL);
			inicializar();
			opcionesControlador.habilitarControles(0);
		}catch(Exception e){
			System.out.println("Error al crear filtro " + e);
			filtroSQL.setCampoOrden("m.id");
			filtroSQL.setTipoOrden("desc");
		}
	}
}
		
